package spring.cloud.tasks.tasks_assign_manager.schedule;


import org.apache.curator.framework.CuratorFramework;
import spring.cloud.tasks.common.BatchTaskInstanceInfo;
import spring.cloud.tasks.common.BatchTaskReStartInfo;
import spring.cloud.tasks.common.node.BlockNodePaths;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;

public class BatchTaskInstanceManager {
    private final String nameSpace;
    protected CuratorFramework curatorFramework;

    public BatchTaskInstanceManager(String nameSpace, CuratorFramework curatorFramework) {
        this.nameSpace = nameSpace;
        this.curatorFramework = curatorFramework;
    }

    /**
     * 批次任务重启信息。在进行操作的时候需要进行复制，要不然引用改了就回不去了
     */
    public ConcurrentHashMap<String, List<BatchTaskReStartInfo>> taskIdToBatchTaskReStartInfoListMap = new ConcurrentHashMap<String, List<BatchTaskReStartInfo>>();
    /**
     * 批次任务状态更新
     */
    //需要建立任务/任务实例/状态(拆分(拆分中/拆分成功)/收集(收集中/收集成功)状态)的节点。
    //有变化立即进行更新状态。注意即使是超时状态下，那么可以设置为拆分成功或者收集成功。
    //那么批次信息又可以跑。当然如果更新状态的时间超过了批次信息清理时间，那么也就没有用了。
    //清理的时间为24小时(默认)或者自己可以设置清理时间。
    public ConcurrentHashMap<String, List<BatchTaskInstanceInfo>> taskIdToBatchTaskInstanceInfoListMap = new ConcurrentHashMap<String, List<BatchTaskInstanceInfo>>();

    //
    public final boolean isMaintain(String taskId, String taskInstanceId, String taskRoundId) {
        if (!taskIdToBatchTaskInstanceInfoListMap.containsKey(taskId)) {
            return false;
        }
        taskIdToBatchTaskInstanceInfoListMap.putIfAbsent(taskId, new ArrayList<>());
        List<BatchTaskInstanceInfo> batchTaskInstanceInfoList = taskIdToBatchTaskInstanceInfoListMap.get(taskId);
        for (BatchTaskInstanceInfo batchTaskInstanceInfo : batchTaskInstanceInfoList) {
            if (batchTaskInstanceInfo.getTaskInstanceId().equals(taskInstanceId)) {
                if (!taskRoundId.equals(batchTaskInstanceInfo.getTaskRoundId())) {
                    //throw new IllegalStateException("当前任务实例只能运行一个轮次");
                    return false;//会被清理掉
                }
                return true;
            }
        }
        return false;
    }

    public void init(CuratorFramework curatorFramework) throws Exception {
        taskIdToBatchTaskReStartInfoListMap = BlockNodePaths.getBatchTaskReStartInfoListMap(curatorFramework);
        taskIdToBatchTaskInstanceInfoListMap = BlockNodePaths.getBatchTaskInstanceInfoListMap(curatorFramework);
    }
}
